#ifndef ICD_SERVICE_H
#define ICD_SERVICE_H

/**
 * 触摸屏服务
 */
#include <stdio.h>
#include <dlfcn.h> // 动态加载动态库的头文件：dlopen()、dlsym()
#include <stdlib.h>
#include <string.h>
#include <unistd.h> //sleep close
#include <errno.h>
#include <fcntl.h> //open
#include <stdbool.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/types.h>   //usr/include/sys/types.h
#include <sys/mman.h>    //mmap
#include <linux/input.h> // struct input_event
#include "common_struct.h"

#define MAX_WI
#define LCD_PATH "/dev/fb0"         // LCD文件位置
#define TS_PATH "/dev/input/event0" // 触摸屏文件位置
// 按钮位置
#define PAUSE_PATH "pause.bmp"
#define PREV_PATH "prev.bmp"
#define NEXT_PATH "next.bmp"
#define UPWARD_PATH "upward.bmp"
#define DOWN_PATH "down.bmp"
#define LEFT_PATH "left.bmp"
#define RIGHT_PATH "right.bmp"
#define BMP_TYPE 0x4d42 // bmp文件类型，十六进制ASCII码4D代表“B”，42代表“M”，也就是字符'BM'
// 显示屏范围
#define MAX_WIDTH 800
#define MAX_HEIGHT 480
// 颜色
#define WHITE 0XFFFFFF  // 白色
#define BLACK 0X000000   // 黑色


extern int *mem_p;     // lcd 内存映射全局变量
extern int lcd_fd;     // lcd文件标识符
extern _state state;   // 视频状态
extern arr_list *list; // 顺序表

struct bitmap_header {
    int16_t type; // 文件标识符，bpm为0x4d42
    int32_t size; // 图像文件大小
    int16_t reserved1;
    int16_t reserved2;
    int32_t offbits;       // bmp图像数据偏移量
} __attribute__((packed)); // 14个字节

struct bitmap_info {
    int32_t size;   // 本结构大小
    int32_t width;  // 图像宽
    int32_t height; // 图像高
    int16_t planes;

    int16_t bit_count; // 色深
    int32_t compression;
    int32_t size_img; // bmp数据大小，必须是4的整数倍
    int32_t X_pel;
    int32_t Y_pel;
    int32_t clrused;
    int32_t clrImportant;
} __attribute__((packed)); // 40个字节

// 以下结构体不一定存在于BMP文件中，除非：bitmap_info.compression为真
struct rgb_quad {
    int8_t blue;
    int8_t green;
    int8_t red;
    int8_t reserved;
} __attribute__((packed));

/**
  action:180°翻转图片
  parameters:
    buf:传递过来的像素点数组
    width:图片的像素宽度
    height:图片的像素高度
    size:移动一个元素需要的位置
*/
void inversion_picture(char *buf, int width, int height, int size);

// 缩小范围
void narrow_down(int *x, int *y);

// 触摸屏操作,获取点击的位置
int *get_touch_location(int *coord);

// 获取图片信息
struct bitmap_info *get_picture_msg(const char *bpm_path, struct bitmap_info *info);

// 在任意位置显示图片
int show_bmp_anyplace(const char *bpm_path, int width, int height, int start_y, int start_x);

// 初始化lcd内存映射数组
int lcd_init();

// 将指定范围改为指定颜色
int lcd_fill(int cloror, int width, int height, int start_x, int start_y);

// 解除映射
int lcd_uninit(void);

// 显示底部按钮
int show_bottom_button();

// 根据页面数显示右侧视频列表
int show_right_list(int page);

// 显示上下翻页键
int show_page_button();

// 显示进度框
int show_progress_dialog();

// 根据进度百分比操作进度条
int show_progress_bar(int progress);

#endif // ICD_SERVICE_H